package com.common.utils;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;

import com.business.domain.T_contract;
import com.business.service.T_contractService;
import com.common.utils.DateUtil;
import org.apache.log4j.Logger;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.business.domain.T_task_node_instance;
import com.easyworkflow.web.spring.WorkFlowController;

//import com.workflow.WorkFlowUtils;
import com.common.db.JsonVO;
import com.common.db.Pg;
import com.common.utils.BeanUtils;
import com.business.domain.T_contract_bill;
//import com.business.mapper.T_contract_billMapper;
import com.business.service.T_contract_billService;

//@Component
public class SchedualAll {

    private static Logger log = Logger.getLogger(SchedualAll.class.getName());

    @Resource
    private T_contract_billService t_contract_billService;
    @Resource
    private T_contractService t_contractService;

    //@Autowired
    //private WorkFlowUtils workFlowUtils;

    //-------------------------------以下为定时任务相关代码----------------------------

    /**
     * cron是一个表达式 可以看下这篇h
     * 字段名              含义　　　　　　　　　　允许的值                        允许的特殊字符
     * seconds            秒                    0-59                            , - * /
     * minutes 　　　　　　 分                    0-59                            , - * /
     * hours              小时                　 0-23                            , - * /
     * daysOfMonth        日                    1-31                            , - * ? / L W C
     * months  　　　　　　 月                    1-12 or JAN-DEC                 , - * /
     * daysOfWeek         周几                　 1-7 or SUN-SAT                  , - * ? / L C #
     * --------------------------------------------------------------------------------------------
     * 使用案例：
     * 0 0 10,14,16 * * ? 每天上午10点，下午2点，4点
     * 　　0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
     * 　　0 0 12 ? * WED 表示每个星期三中午12点
     * 　　"0 0 12 * * ?" 每天中午12点触发
     * 　　"0 15 10 ? * *" 每天上午10:15触发
     * 　　"0 15 10 * * ?" 每天上午10:15触发
     * 　　"0 15 10 * * ? *" 每天上午10:15触发
     * 　　"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
     * 　　"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
     * 　　"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
     * 　　"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
     * 　　"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
     * 　　"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
     * 　　"0 15 10 15 * ?" 每月15日上午10:15触发
     * 　　"0 15 10 L * ?" 每月最后一日的上午10:15触发
     * 　　"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
     * 　　"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
     */

    //@Scheduled(fixedRate = 3000) //每3秒执行一次，不管前面有没有执行完；
    public void fixedRate() {
        log.info("------test fixedRate = 3000 print!------");

    }

    @Scheduled(fixedDelay = 1000 * 60 * 1) //每 1000毫秒秒 * 5 * 60 = 5分钟执行一次，前面执行完后才会触发；
    public void fixedDelay() {
        try {
            log.info("------test fixedDelay = 每 1000毫秒秒 * 1 * 60 = 1分钟 print!------");
            //说明、执行水费电费生成；根据导入的水费电费月初月末读数； 按照楼栋房号 * 物业合同中水电基础单价；更新到totalamount字段；

            //1.1、待生成水费数据读取；
            T_contract_bill t_contract_bill = new T_contract_bill();
            t_contract_bill.setBilltype("水费");
            t_contract_bill.setBiztype("wuye");
            t_contract_bill.setStatus("待生效");
            t_contract_bill.setPageSize(100000);
            t_contract_bill.setStartNo(0);
            t_contract_bill.setEndNo(1000000);
            List t_contract_billList = t_contract_billService.findAll(t_contract_bill);
            if(null!=t_contract_billList){
                Iterator it = t_contract_billList.iterator();
                T_contract t_contract = new T_contract();
                while (null != it && it.hasNext()) {
                    t_contract_bill = (T_contract_bill) it.next();
                    t_contract.setBuildingname(t_contract_bill.getExt2());
                    t_contract.setHousename(t_contract_bill.getExt3());
                    t_contract.setStatus("已生效");
                    t_contract.setStartNo(0);
                    t_contract.setPageSize(100);

                    //1.2、合同中水费单价读取
                    List t_contractList = t_contractService.findAll(t_contract);
                    if (t_contractList != null && t_contractList.size() > 0) {
                        t_contract = (T_contract) t_contractList.get(0);
                        //t_contract.energytprice 水费单价； t_contract.contractprice 电费单价；
                        String sfyc = t_contract_bill.getExt5(); //水费月初数字
                        String sfym = t_contract_bill.getExt6(); //水费月末数字

                        //1.3、加工水费数据
                        Double sfPrice = t_contract.getEnergytprice(); //水费单价
                        //加法 add()函数 、减法subtract()函数、乘法multiply()函数、除法divide()函数；
                        String totalSHMoney = new BigDecimal(sfym).subtract(new BigDecimal(sfyc)).multiply(new BigDecimal(sfPrice.toString())).setScale(2).toString();
                        t_contract_bill.setTotalprice(new Double(totalSHMoney));
                        t_contract_bill.setExt1(t_contract.getConpanyname());
                        t_contract_bill.setContractno(t_contract.getContractno());

                        //1.4、更新水费数据
                        int resrow = t_contract_billService.update(t_contract_bill);
                        if(resrow>0){
                            log.info("------批量更新水费、电费数据对应楼栋=" + t_contract.getBuildingname() + ",房号=" + t_contract.getHousename() +",水费月初数字="+sfyc+"，水费月末数字="+sfym+",单价="+sfPrice+ "，本期水费总金额="+totalSHMoney);
                        }else{
                            log.error("------批量更新水费、电费数据对应楼栋=" + t_contract.getBuildingname() + ",房号=" + t_contract.getHousename() +",水费月初数字="+sfyc+"，水费月末数字="+sfym+",单价="+sfPrice+ "，本期水费总金额="+totalSHMoney+"数据失败，更新到数据记录数=0！");
                        }
                    } else {
                        log.error("------查询水费、电费数据对应楼栋=" + t_contract.getBuildingname() + ",房号=" + t_contract.getHousename() + "数据没有，请确认导入该楼栋房号水费、电费数据是否正确!");
                    }
                }

            }

            //2.1、待生成水费数据读取；

            //2.2、合同中水费单价读取

            //2.3、加工水费数据

            //2.4、更新水费数据
        } catch (Exception e) {
            e.printStackTrace();
            log.error("------批量计算水费、电费账单数据出错error=" + e.toString());
        }

    }

    //  每隔5分钟执行一次：* */5 * * * ?
    //@Scheduled(cron = "*/3 * * * * ?")
    public void cron() {
        log.info("------test croncron = \"*/3 * * * * ?  print!------");

    }

}









